<?php
/**
 * Inter组件之Session存储器：Demo示例
 * 本Demo用于示例如何编写一个Session存储器（独立类别）
 *
 * @author Horse Luke<horseluke@126.com>
 * @copyright Horse Luke, 2010
 * @license the Apache License, Version 2.0 (the "License"). {@link http://www.apache.org/licenses/LICENSE-2.0}
 * @version $Id: Demo.php 158 2011-02-04 16:14:12Z horseluke@126.com $
 * @package Inter_Session
 * @subpackage Inter_Session_Storage
 */
class Inter_Session_Storage_Demo extends Inter_Session_Storage_Abstract{
    
    /**
     * 配置选项数组
     * @var array
     */
    protected $_config = array();

    /**
     * 是否已经连接？
     * @var bool
     */
    protected $_connected = false;
    
    /**
     * 是否已经运行了GC？
     * @var bool
     */
    protected $_gcRunned = false;
    
    /**
     * 构造函数
     */
    public function __construct(){
        $this->_init();
    }
    
    /**
     * 打开一个session
     * @param string $save_path
     * @param string $session_name
     * @return bool
     */
    public function open($save_path, $session_name){
        //[CODE INSERT - IF NEEDED OR MUST TO DO]在这里编写你要打开具体打开某些资源的代码
        //如果你想和这个demo一样将所有相关代码写到{@link Inter_Session_Storage_Demo::_connect()}，那就不用动代码
        //否则则需要自行在这里编写，并在后面将$this->_connected赋值为true
        $this->_connect();
        return true;
    }
    
    /**
     * 关闭一个session
     * @return bool
     * 
     */
    public function close(){
        //[CODE INSERT - IF NEEDED OR MUST DO SO]如果该操作器所操作的对象本身没有gc功能（比如数据库），则需要开启下面的代码；
        //否则，则可不需要以下的代码（比如Memcache）
        /*
        if(rand($this->_config['session.gc_probability'],$this->_config['session.gc_divisor']) <= $this->_config['session.gc_probability']){
            $this->gc($this->_config['session.gc_maxlifetime']);
        }
        */
        //[CODE INSERT - IF NEEDED]如有需要，你可在这里断开连接：
        //$this->_disconnect();
        return true;
    }
    
    /**
     * 读取一个session
     * @param string $id session id
     * @return string  session数据。按原样传出字符串
     */
    public function read($id){
        if(false == $this->_connected){
            return '';
        }
        
        //[CODE INSERT - MUST DO SO]在这里编写你要返回session数据的代码
        $sess_data = '';
        return $sess_data;
    }
    
    /**
     * 写入一个session
     * @param string $id session id
     * @param string $sess_data session数据。为兼容php自身行为，请保证传入的是字符串
     */
    public function write($id, $sess_data){
        if(false == $this->_connected){
            return false;
        }
        //[CODE INSERT - MUST DO SO]在这里编写你要写入session数据的代码
        
    }
    
    /**
     * 销毁一个session
     * @param string $id session id
     */
    public function destroy($id){
        if(false == $this->_connected){
            return false;
        }
        
        //[CODE INSERT - MUST DO SO]在这里编写你要销毁指定session id的数据的代码
    }
    
    /**
     * session回收
     * @param integer $maxlifetime session存活时间
     */
    public function gc($maxlifetime){
        if( true == $this->_gcRunned ){
            return true;
        }
        if(false == $this->_connected){
            return false;
        }
        
        //[CODE INSERT - MUST DO SO]在这里编写你要执行垃圾回收session的代码
    }
    
    /**
     * 初始化本类相关资源
     */
    protected function _init(){
        //[CODE INSERT - IF NEEDED OR MUST DO SO]在这里编写你要初始化本类相关资源的代码
        //其中读取配置已经被放到单独的方法{@Inter_Session_Storage_Demo::_readConfig()}
        $this->_readConfig();
    }
    
    /**
     * 读取相关配置文件，并且存放到$this->_config中
     */
    protected function _readConfig(){
        //[CODE INSERT - IF NEEDED OR MUST DO SO]在这里编写你要读取相关配置的方法
        $this->_config = require dirname(__FILE__). '/../../../../Config/'. __CLASS__. '.php';
    }
    
    /**
     * 连接
     */
    protected function _connect(){
        if(false == $this->_connected){
            //[CODE INSERT - IF NEEDED OR MUST DO SO]在这里填写连接代码，然后将$this->_connected赋值为true
            $this->_connected = true;
        }
    }
    
    /*
     * 断开连接（如有必要的话）
     */
    /*
    protected function _disconnect(){
        if(true == $this->_connected){
            //[CODE INSERT - IF NEEDED]在这里填写断开连接代码，然后将$this->_connected赋值为false
            $this->_connected = false;
        }
    }
    */
    
}